/*******************************************************************************
 * Copyleft (c) 2021 Kcode
 *
 * @file    video_manager.h
 * @brief   视频数据管理者头文件，向下支持各种视频数据，向上提供接口
 * @author  K
 * @version 0.0.1
 * @date    2021-07-26
 * @license MulanPSL-1.0
 *
 * 文件修改历史：
 * <时间>       | <版本>    | <作者>  | <描述>
 * 2021-07-26   | v0.0.1    | Kcode   | 视频数据管理者头文件
 * -----------------------------------------------------------------------------
 ******************************************************************************/

#ifndef _VIDEO_MANAGER_H
#define _VIDEO_MANAGER_H

#include "config.h"
#include "pic_operation.h"

#define REQ_BUFFER_NUM          4   /**< 分配的缓冲区个数 */
#define INTERFACE_STREAMING     1
#define INTERFACE_READWRITE     2


typedef struct VideoDevice T_VIDEODEVICE, *PT_VIDEODEVICE;
typedef struct VideoBuf T_VIDEOBUF, *PT_VIDEOBUF;
typedef struct VdieoOpr T_VIDEOOPR, *PT_VIDEOOPR;

/*!
 * 摄像头的描述信息
 */
struct VideoDevice {
    int fd;                 /**< 文件句柄 */
    int pixel_format;       /**< 像素格式 */
    int width;              /**< 图像宽度 */
    int height;             /**< 图像高度 */
    int videobuf_num;       /**< 分配缓冲区个数 */
    int videeobuf_maxlen;   /**< 每个缓存区的大小 */
    int cur_bufindex;       /**< 存储从队列取出缓冲区的index */
    
    /**! 所分配的缓冲区 */
    unsigned char *videobuf[REQ_BUFFER_NUM];

    PT_VIDEOOPR video_opr;  /**< 数据处理 */
};

/*!
 * 存储视频数据
 */
struct VideoBuf {
    T_PIXELDATAS pixel_data;    /**< 借用T_PixelDatas */
    int pixel_format;           /**< 像素格式 */
};

/*!
 * 视频数据处理结构体
 */
struct VdieoOpr {
    char *name; /**< 设备名 */
    
    /* 初始化设备 */
    int (*InitDevice)(char *dev_name, PT_VIDEODEVICE video_device);

    /* 退出设备 */
    int (*ExitDevice)(PT_VIDEODEVICE video_device);

    /* 启动设备 */
    int (*StartDevice)(PT_VIDEODEVICE video_device);

    /* 停止设备 */
    int (*StopDevice)(PT_VIDEODEVICE video_device);

    /* 获得视频数据 */
    int (*GetFrame)(PT_VIDEODEVICE video_device, PT_VIDEOBUF video_buf);

    /* 获得视频格式 */
    int (*GetFormat)(PT_VIDEODEVICE video_device);

    /* 把视频数据放回队列 */
    int (*PutFrame)(PT_VIDEODEVICE video_device, PT_VIDEOBUF video_buf);

    struct VdieoOpr *ptNext;
};

/*!
 * @brief  初始化函数，把s_V412VideoOpr结构体注册进链表中
 * @param  [in] 无
 * @return 0：成功 -1：失败 
 */
int V4l2Init(void);

/*!
 * @brief  初始化设备函数，把对支持的各个设备进行初始化工作
 * @param  devname[in] 名字
 * @param  video_dev[in] 视频设备
 * @return  0：初始化成功 -1：失败
 */
int VideoDeviceInit(char * devname, PT_VIDEODEVICE video_dev);

/*!
 * @brief  初始化函数，把对支持的各个设备注册进链表进行统一管理
 * @param  [in] 无
 * @return  无
 */
int VideoInit(void);

/*!
 * @brief  注册函数
 * @param  ptVideoOpr[in] 要注册的设备结构体结点
 * @return 0：成功 -1：失败
 */
int RegisterVideoOpr(PT_VIDEOOPR ptVideoOpr);

/*!
 * @brief  显示所支持的设备
 * @param  [in] 无
 * @return 无 
 */
void ShowVideoOpr(void);


#endif /* _VIDEO_MANAGER_H */

